よく使いそうなS3関連のセキュリティ機能をまとめてみる
よく使いそうな S3関連のセキュリティ機能を主観でまとめてみます。 「汎用的」、「便利」、「コスパが良い」といった基準で選びました。
6つのセキュリティ機能を説明していきます。
- ブロックパブリックアクセス
- ACL無効化
- デフォルト暗号化
- S3 Storage Lens
- GuardDutyの「S3保護」
- Security Hubの「セキュリティ基準」
ブロックパブリックアクセス(以降 BPA)
「意図しないS3バケットの公開」を未然に防ぐ ための機能です。 アカウントレベル、もしくはバケットレベルで設定できます。
設定パラメータは 4つあります。
BlockPublicAcls
… パブリックACLを付けた投稿(Put Object)ができなくなりますIgnorePublicAcls
… すべてのパブリックACLを無視しますBlockPublicPolicy
… パブリックなバケットポリシーを設定できなくなりますRestrictPublicBuckets
… パブリックなアクセスのみ制限されます
※「パブリックの定義とは?」あたりの深い話は割愛します。公式ドキュメント を参照ください。
(▲ マネコン設定画面は日本語文章が長くて萎縮してしまいます)
S3バケットの初期値として 『バケットレベルのBPA を全て有効化』 とすると良いでしょう。 パブリック公開する用途のあるバケットのみ、チェックを外していきます。
アカウントレベルのBPA を使うことで、アカウント内の全バケットにBPAを適用できます。 以下のようなケースでは積極的に有効化しましょう。
ケース1:
『全バケットでBPA(バケット単位) を有効化している』 かつ『今後パブリックバケットは作らない』ケース2:
新規アカウント作成時のデフォルト設定
ACL無効化
『ACLによるアクセス制御の考慮』から解放 されます。 バケットへのアクセス制御を ポリシー(IAMユーザーポリシーやバケットポリシー)に 絞ることができます。
これから作るバケットは積極的に無効化していきましょう。 マネコンからバケットを作るときのデフォルト(推奨)にもなってます。
この機能(ACL無効化)自体は比較的新しく、2021/12 に実装された設定値です。 詳しくは以下ブログを参照ください。 ACLが無くなった背景もこちらで記述しています。
1点注意があります。AWSサービスのロギングで『 awslogsdelivery
アカウントから
S3バケットへ書き込むタイプ』 のものは、
この『ACL無効化』を適用できない可能性があります。
以下 CloudFront ログの事例です。
デフォルト暗号化
漏れ無くオブジェクトの暗号化保存 が可能になります。 データ漏洩の対策になります。データの暗号化はお客様側の責任なので、必ず対応しましょう。
基本は SSE-S3(AWS管理キー) での暗号化で十分です。 以下のような要件がある場合は SSE-KMS(カスタマー管理キー) で暗号化することを検討しましょう。
- 企業のセキュリティポリシー
- オブジェクトへの柔軟なアクセス制御を実現したい
- データコントロールを企業側で完全に制御したい 等
Tips: 設定の抜け漏れのないように自動修復の仕組みを構築できます。
S3 Storage Lens
基本無料の可視化ツール です。 S3バケット、オブジェクトの使用状況やアクティビティを確認できます。 標準メトリクス分は無料で利用できます。 無料分は とりあえず有効化しておくと良いでしょう。
[2022/06/23 追記] デフォルトダッシュボード(無料分)が事前に作成されています。これを見る分には、追加の有効化作業は必要ありません。
GuardDutyの「S3保護」
S3オブジェクト操作の脅威検知機能 です。これを有効化すると、 GuardDutyは S3のオブジェクトレベルのAPIをモニタリングします。 S3バケット内で起きた不審なオブジェクト操作を検知できます。
特にチューニングも必要なく、完全マネージドに見てくれる便利機能なので有効化しておきましょう。
Security Hubの「セキュリティ基準」
Security Hub を使って AWS環境のセキュリティチェック を実施できます。 特に、セキュリティ基準である『基礎セキュリティのベストプラクティス』を使うことで、 幅広いAWSサービスのセキュリティチェックがカバーされます。
S3に関するコントロール(チェック項目)も充実してきました。 現時点(2022/05)では以下チェックが可能です (参考: AWS Foundational Security Best Practices コントロール #S3 - AWS Security Hub)。
- [S3.1] S3 ブロックパブリックアクセス設定を有効にする必要があります
- [S3.2] S3 バケットはパブリック読み取りアクセスを禁止する必要があります
- [S3.3] S3 バケットはパブリック書き込みアクセスを禁止する必要があります
- [S3.4] S3 バケットでは、サーバー側の暗号化を有効にする必要があります
- [S3.5] S3 バケットでは Secure Socket Layer を使用するためのリクエストを求める必要があります
- [S3.6] S3 バケットポリシーで他の AWS アカウントに付与される S3 アクセス許可は制限する必要があります
- [S3.8] S3ブロックのパブリックアクセス設定はバケットレベルで有効にすべき
- [S3.9] S3のサーバーアクセスログは有効化する必要があります
- [S3.10] バージョニングが有効なS3バケットには、ライフサイクルポリシーが設定されている必要があります
- [S3.11] S3バケットはイベント通知を設定する必要があります
- [S3.12] S3 ACLを ユーザーアクセス管理で使用すべきではありません
※全てを対応する必要はありません。各コントロールには重要度のラベルが付与されています。 重要度の高いものから優先して「対応するか/しないか」判断していくと良いでしょう。
S3バケットの設定がセキュリティベストプラクティスに従っているか、チェックするためにも有効化して活用しましょう。
おわりに
以上、よく使いそうな S3関連のセキュリティ機能を列挙してみました。 どれも適用自体は簡単にできるので、活用していくと良いでしょう。
参考
- Amazon S3 ストレージへのパブリックアクセスのブロック - Amazon Simple Storage Service
- オブジェクトの所有権の制御とバケットの ACL の無効化。 - Amazon Simple Storage Service
- Amazon S3 のデフォルトバケット暗号化の有効化 - Amazon Simple Storage Service
- 【アップデート】S3でACLを無効化できるようになりました #reinvent | DevelopersIO
- CloudFrontのアクセスログ保存用S3バケットにはACL有効化が必要なので注意しよう | DevelopersIO
- Config ルール・自動修復を使ってS3全バケットのデフォルト暗号化を自動的に有効化する | DevelopersIO
- S3 の利用状況が一目瞭然!しかも無料!「Amazon S3 Storage Lens」がリリースされました! | DevelopersIO
- Amazon GuardDuty で S3 への不審なアクティビティを脅威検出できるようになりました! | DevelopersIO
- AWS Foundational Security Best Practices コントロール - AWS Security Hub